#  $Id: session.py 7557b5d4d82b 2012/12/02 09:07:16 pgurumur $
#  Copyright (c) 2009 Prabhu Gurumurthy  <pgurumur@gmail.com>
#  
#  Permission to use, copy, modify, and distribute this software for any
#  purpose with or without fee is hereby granted, provided that the above
#  copyright notice and this permission notice appear in all copies.
# 
#  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
#  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
#  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
#  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
#  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
#  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
#  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

__version__ = "$Revision: 7557b5d4d82b $"
__author__ = "$Author: pgurumur $"

import sys
import datetime

from django.conf import settings
from django.contrib.sessions.models import Session
from django.utils.cache import patch_vary_headers

from djanet import utils
from djanet.lib import stdlib

class SessionMiddleware(object):
   def __init__(self):
      self.log = utils.loghandle(stdlib.my_name(self))
      super(stdlib.my_class(self), self).__init__()

   def process_request(self, request):
      engine = __import__(settings.SESSION_ENGINE, {}, {}, [''])
      request.session = engine.SessionStore(request.COOKIES.get(
         settings.SESSION_COOKIE_NAME, None))

   def process_response(self, request, response):
      # If request.session was modified, or if response.session was set, save
      # those changes and set a session cookie.
      patch_vary_headers(response, ('Cookie',))
      modified = None
      try:
         modified = request.session.modified
      except AttributeError:
         pass
      else:
         if modified or settings.SESSION_SAVE_EVERY_REQUEST:
            session_key = request.session.session_key or \
                  Session.objects.get_new_session_key()

            if not request.session.get(settings.PERSISTENT_SESSION_KEY, False):
               # session will expire when the user closes the browser
               max_age = None
               expires = None
            else:
               max_age = settings.SESSION_COOKIE_AGE
               expires = datetime.datetime.strftime(
                     datetime.datetime.utcnow() + datetime.timedelta(
                        seconds=settings.SESSION_COOKIE_AGE),
                     "%a, %d-%b-%Y %H:%M:%S GMT")

            new_session = Session.objects.save(
                  session_key, request.session._session,
                  datetime.datetime.now() + datetime.timedelta(
                     seconds=settings.SESSION_COOKIE_AGE))
            response.set_cookie(settings.SESSION_COOKIE_NAME, session_key,
                  max_age = max_age, expires = expires,
                  domain = settings.SESSION_COOKIE_DOMAIN,
                  secure = settings.SESSION_COOKIE_SECURE or None)

      return response

   def process_exception(self, request, exception):
      self.log("%s: %s", str(type(exception)), exception)
